package com.easylinkin.linkappapi.lobar.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.easylinkin.linkappapi.common.model.RequestModel;
import com.easylinkin.linkappapi.lobar.dto.UserCountByProjectDTO;
import com.easylinkin.linkappapi.lobar.dto.UserCountByWorkDTO;
import com.easylinkin.linkappapi.lobar.dto.UserProjectDTO;
import com.easylinkin.linkappapi.lobar.dto.app.AppUserGateDTO;
import com.easylinkin.linkappapi.lobar.dto.app.EnterpriseDTO;
import com.easylinkin.linkappapi.lobar.dto.app.EpidemicDTO;
import com.easylinkin.linkappapi.lobar.dto.app.LobarUserDTO;
import com.easylinkin.linkappapi.lobar.dto.screen.HourAnalysisDTO;
import com.easylinkin.linkappapi.lobar.dto.screen.LobarScreenDTO;
import com.easylinkin.linkappapi.lobar.dto.screen.WarningDTO;
import com.easylinkin.linkappapi.lobar.entity.UserStatistics;
import com.easylinkin.linkappapi.lobar.vo.LobarScreenWarnVo;

import com.easylinkin.linkappapi.tenant.dto.LinkappTenantDTO;
import java.util.List;
import java.util.Map;

/**
 * @Author: kan yuanfeng
 * @Date: 2022/4/27 15:09
 * @Description: 大屏统计
 */
public interface LobarScreenService {

  /**
   * @Description: 人员分析(劳务公司,在场人数,劳务工种)
   * type有值表示需要过滤，取分包单位数据
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  Map<String, Integer> countAnalysis(Integer type);

  /**
   * @Description: 人员统计
   * type有值表示需要过滤，取分包单位数据
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  Map<String, List<LobarScreenDTO>> countUser(Integer type);

  /**
   * 当前出场人数时间图
   * type有值表示需要过滤，取分包单位数据
   */
  List<LobarScreenDTO> userByTime(Integer type,Integer userWorkType);

  /**
   * 各参建单位出勤率
   */
  List<LobarScreenDTO> attendance(Integer type,Integer userWorkType);

  /**
   * 工时分析
   */
  HourAnalysisDTO hourAnalysis();

  /**
   * 风险预警统计
   */
  WarningDTO warning();

  /**
   * 在场人数
   * type有值表示需要过滤，取分包单位数据
   * @return
   */
  Map<String, Integer> onNum(Integer type,String tenantId);

  /**
   * 7天出勤率
   * @param userWorkType 人员类型 1:作业人员 2:管理人员
   */
  List<UserStatistics> sevenAttendance(Integer userWorkType);

  /**
   * 出勤分析
   */
  List<LobarUserDTO> analysisMonth();

  /**
   * 按工种统计
   */
  List<LobarUserDTO> getAttnByWorkType();

  /**
   * 出勤统计
   */
  List<AppUserGateDTO> statistics();

  /**
   * 参建单位统计
   */
  List<AppUserGateDTO> getByCompany();

  /**
   * 最新考勤
   */
  List<UserProjectDTO> newAttention();

  /**
   * 最新进场
   */
  List<UserProjectDTO> newJoin();
  /**
   * 风险预警统计2
   *
   * @param lobarScreenWarnVo 劳务大屏报警入参vo
   * @return 统一出参
   */
  WarningDTO lobarWarning(LobarScreenWarnVo lobarScreenWarnVo);

  /**
   * 人员分布分析
   */
  Map<String, List<LobarScreenDTO>> countAllUser(String tenantId, String companyId);


  /**
   * 人员分布分析-按年龄段
   * @param tenantId 租户id
   * @param companyId 企业id
   * @return
   */
  List<LobarScreenDTO> listGroupByAgePeriod(String tenantId, String companyId);

  /**
   * 作业人员统计
   */
  Map<String, List<LobarScreenDTO>> countWorkType(String tenantId);

  /**
   * 项目详情
   */
  IPage<LinkappTenantDTO> countProject(RequestModel<UserProjectDTO> requestModel);

  /**
   * 当日疫情分析
   */
  List<Map<String, Object>> countEpidemic(String tenantId);

  /**
   * 参建单位分析
   */
  List<Map<String, Object>> countCompany(String tenantId);

  /**
   * 参建单位分析 app端
   */

  Map<String, Integer> countAppCompany();

  /**
   * 防疫统计 app
   */
  Map<String, Object> countAppEpidemic();

  /**
   * 参建单位分析详情 app端
   */
  IPage<EnterpriseDTO> countAppCompanyDetail(RequestModel<UserProjectDTO> requestModel);

  /**
   * 防疫统计详情 app端
   */
  IPage<EpidemicDTO> countAppEpidemicDetail(RequestModel<UserProjectDTO> requestModel);

  /**
   * 当前现场人员统计总人数
   */
  LobarUserDTO countAll(UserProjectDTO userProjectDTO);

  /**
   * 折线图(项目级)
   */
  List<LobarUserDTO> countByProject(UserProjectDTO userProjectDTO);

  /**
   * 工种统计（企业级）
   */
  Map<String, List<LobarScreenDTO>> countEnWorkType(String tenantId);

  /**
   * 在场情况
   */
  Map<String, Integer> onArea();

  /**
   * 面板机最近打卡计数和最近打卡人数
   */
  Map<String, Object> getByDeviceCode(String deviceCode);

  /**
   * 岗亭大屏在场人数
   */
  Map<String, Integer> onNum4Box();

  /**
   * 项目人员数分布
   * @param companyId 企业id
   * @return 项目人员数分布
   */
  List<UserCountByProjectDTO> listUserCountByProject(String companyId);

  /**
   * 工种人员数分布
   * @param companyId 企业id
   * @return 工种人员数分布
   */
    List<UserCountByWorkDTO> listUserCountByWork(String companyId);
}
